Skip to main content

Styling

Add CSS styles to make the application look polished.


Create a Stylesheet

Create src/static/css/base/pet-styles.css:

body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f5f5f5;
}

.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}

.breed-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}

.breed-card {
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
padding: 15px;
}

.breed-card:hover {
transform: translateY(-5px);
}

.breed-name {
text-transform: capitalize;
margin: 0 0 10px;
color: #333;
}

.dog-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 20px;
}

.dog-card {
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

.dog-image {
width: 100%;
height: 250px;
object-fit: cover;
}

.dog-info {
padding: 15px;
}

.btn {
display: inline-block;
padding: 8px 16px;
background: #4CAF50;
color: white;
text-decoration: none;
border-radius: 4px;
margin-top: 10px;
}

.back-link {
display: inline-block;
margin-bottom: 20px;
text-decoration: none;
color: #4CAF50;
}

Register the Stylesheet

Import the CSS in client/styles.js:

client/styles.js
import "@css/base/pet-styles.css";

Update Home Component

Apply the new classes to src/js/pages/Home/Home.js:

src/js/pages/Home/Home.js
import React from "react";
import { useCurrentRouteData, Link } from "@tata1mg/router";

const Home = () => {
const { data, error, isFetching } = useCurrentRouteData();

if (isFetching) return <div className="container">Loading breeds...</div>;
if (error) return <div className="container">Error: {error.message}</div>;

const breeds = Object.keys(data?.message || {});

return (
<div className="container">
<h1>Dog Breeds</h1>
<div className="breed-list">
{breeds.slice(0, 12).map((breed) => (
<div key={breed} className="breed-card">
<h2 className="breed-name">{breed}</h2>
<Link to={`/breed/${breed}`} className="btn">
View Dogs
</Link>
</div>
))}
</div>
</div>
);
};

Home.serverFetcher = async () => {
const response = await fetch("https://dog.ceo/api/breeds/list/all");
return response.json();
};

Home.clientFetcher = async () => {
const response = await fetch("https://dog.ceo/api/breeds/list/all");
return response.json();
};

export default Home;

Update BreedDetails Component

Apply classes to src/js/pages/BreedDetails/BreedDetails.js:

src/js/pages/BreedDetails/BreedDetails.js
import React from "react";
import { useCurrentRouteData, useParams, Link } from "@tata1mg/router";

const BreedDetails = () => {
const { breed } = useParams();
const { data, error, isFetching } = useCurrentRouteData();

if (isFetching) return <div className="container">Loading...</div>;
if (error) return <div className="container">Error: {error.message}</div>;

const images = data?.message || [];

return (
<div className="container">
<Link to="/" className="back-link">← Back to Breeds</Link>
<h1 className="breed-name">{breed} Dogs</h1>
<div className="dog-list">
{images.slice(0, 8).map((url, index) => (
<div key={index} className="dog-card">
<img src={url} alt={`${breed} ${index + 1}`} className="dog-image" />
</div>
))}
</div>
</div>
);
};

BreedDetails.serverFetcher = async ({ params }) => {
const response = await fetch(`https://dog.ceo/api/breed/${params.breed}/images`);
return response.json();
};

BreedDetails.clientFetcher = async ({ params }) => {
const response = await fetch(`https://dog.ceo/api/breed/${params.breed}/images`);
return response.json();
};

export default BreedDetails;

Refresh your browser to see the styled application.

Next, we'll add a layout with header and footer.